#!/bin/bash

# 配置区域：根据实际需求修改以下变量
USERS=("root" "user2" "user3")  # 需要监控的用户数组
WARNING_DAYS=7                   # 提前预警天数
LOG_FILE="/var/log/password_change.log"
PASSWORD_LENGTH=16               # 生成密码长度
MAIL_NOTIFY="admin@example.com"  # 通知邮箱（需先配置邮件服务）

# 密码生成函数（兼容没有pwgen的环境）
generate_password() {
    # 方法1：使用openssl生成（默认）
    openssl rand -base64 20 | tr -dc 'a-zA-Z0-9!@#$%^&*()_+' | head -c${PASSWORD_LENGTH}

    # 方法2：使用pwgen生成（需要安装pwgen）
    # pwgen -y -s ${PASSWORD_LENGTH} 1
}

# 日志记录函数
log_message() {
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[${timestamp}] $1" >> "${LOG_FILE}"
}

# 主程序
for USERNAME in "${USERS[@]}"; do
    # 检查用户是否存在
    if ! id "${USERNAME}" &>/dev/null; then
        log_message "[${USERNAME}] 错误：用户不存在"
        continue
    fi

    # 获取密码过期信息
    password_info=$(chage -l "${USERNAME}" 2>/dev/null)
    if [ $? -ne 0 ]; then
        log_message "[${USERNAME}] 错误：无法获取密码策略信息"
        continue
    fi

    # 解析过期时间
    expiry_line=$(grep 'Password expires' <<< "${password_info}" | cut -d':' -f2 | sed 's/^ *//;s/ *$//')

    if [[ "${expiry_line}" == "never" ]]; then
        log_message "[${USERNAME}] 密码永不过期"
        continue
    fi

    # 转换为时间戳
    expiry_ts=$(date -d "${expiry_line}" +%s 2>/dev/null)
    if [[ -z "${expiry_ts}" ]]; then
        log_message "[${USERNAME}] 错误：无法解析过期时间 '${expiry_line}'"
        continue
    fi

    # 计算剩余天数
    current_ts=$(date +%s)
    days_left=$(( (expiry_ts - current_ts) / 86400 ))

    if (( days_left > WARNING_DAYS )); then
        log_message "[${USERNAME}] 密码状态正常，剩余天数：${days_left}"
        continue
    fi

    # 密码修改流程
    log_message "[${USERNAME}] 开始密码修改流程，剩余天数：${days_left}"
    
    # 生成新密码
    new_password=$(generate_password)
    if [ -z "${new_password}" ]; then
        log_message "[${USERNAME}] 错误：密码生成失败"
        continue
    fi

    # 修改密码（兼容不同发行版）
    if echo "${USERNAME}:${new_password}" | chpasswd 2>/dev/null; then
        log_message "[${USERNAME}:${new_password}] 密码修改成功"
        
        # 发送邮件通知（需要配置mailutils/postfix）
        if [ -n "${MAIL_NOTIFY}" ]; then
            echo "[${USERNAME}] 密码已自动重置" | mail -s "密码变更通知" "${MAIL_NOTIFY}"
        fi

        # 更新最后修改日期（可选）
        chage --lastday 0 "${USERNAME}"
    else
        log_message "[${USERNAME}] 错误：密码修改失败"
    fi
done

exit 0